Subscripting is allowed on arrays that are not lvalues, even though the unary & operator is not. For example, this is valid in GNU C though not valid in other C dialects:
struct foo {
int a[4];
};
struct foo f();
bar (int index) {
return f().a[index];
}